#include<iostream>

using namespace std;

typedef long long LL;

const int N=1e5+10;

LL w[N],n,m;

struct node
{
	LL l,r;
	LL lz,sum;
}tr[N*4];

void bulid(LL u,LL l,LL r,LL w[])
{
	tr[u]={l,r,0};
	if(l==r) 
	{
		tr[u].sum=w[l];
		return;
	}
	LL mid=(l+r)/2;
	bulid(u*2,l,mid,w);
	bulid(u*2+1,mid+1,r,w);
	tr[u].sum=tr[u*2].sum+tr[u*2+1].sum;
	return;
}

void push_down(LL u)
{
	if(tr[u].lz!=0)
	{
		tr[u*2].lz+=tr[u].lz;
		tr[u*2+1].lz+=tr[u].lz;
		LL mid=(tr[u].l+tr[u].r)/2;
		tr[u*2].sum+=tr[u].lz*(mid-tr[u].l+1);
		tr[u*2+1].sum+=tr[u].lz*(tr[u].r-mid);
		tr[u].lz=0;
	}
	return;
}

void modify(LL u,LL l,LL r,LL k)
{
	if(tr[u].l>=l && tr[u].r<=r)
	{
		tr[u].sum+=k*(tr[u].r-tr[u].l+1);
		tr[u].lz+=k;
		return;
	}
	push_down(u);
	if(tr[u*2].r>=l) modify(u*2,l,r,k);
	if(tr[u*2+1].l<=r) modify(u*2+1,l,r,k);
	tr[u].sum=tr[u*2].sum+tr[u*2+1].sum;
	return;
}

LL query(LL u,LL l,LL r)
{
	if(tr[u].l>=l && tr[u].r<=r)
	{
		return tr[u].sum;
	}
	push_down(u);
	LL num=0;
	if(tr[u*2].r>=l) num+=query(u*2,l,r);
	if(tr[u*2+1].l<=r) num+=query(u*2+1,l,r);
	return num;
	
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
	bulid(1,1,n,w);
	while(m--)
	{
		int t;
		scanf("%d",&t);
		if(t==1)
		{
			LL x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			modify(1,x,y,k);
		}
		if(t==2)
		{
			LL x,y;
			scanf("%lld%lld",&x,&y);
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
